import type { App } from 'vue'
import type { I18nOptions } from 'vue-i18n'
import { createI18n } from 'vue-i18n'
import { setHtmlPageLang } from '@/locales'
import { localeSetting } from './localeSetting'
import { useLocaleStore } from '@/store/modules/locale'

const { fallback, availableLocales } = localeSetting

const modules = import.meta.glob('./lang/*.y(a)?ml')
const messages = {}
for (const path in modules) {
    modules[path]().then((mod: any) => {
        const yaml = path.endsWith('.yaml')
        const key = path.slice(7, yaml ? -5 : -4)
        messages[key] = mod.default
    })
}

export let i18n: ReturnType<typeof createI18n>

async function createI18nOptions(): Promise<I18nOptions> {
    const localeStore = useLocaleStore()
    const locale = localeStore.getLocale

    setHtmlPageLang(locale)

    return {
        messages,
        // setup only
        legacy: false,
        // 所选语言
        locale,
        // 默认语言
        fallbackLocale: fallback,
        // 可用的语言环境
        availableLocales,
        // 是否抑制本地化失败时输出的警告
        silentTranslationWarn: true,
        // 是否抑制本地化失败时输出的警告
        missingWarn: false,
        // 是否将根级语言环境同步到组件本地化语言环境
        sync: true,
        // 本地化失败时是否抑制回退警告
        silentFallbackWarn: true
    }
}

export async function setupI18n(app: App) {
    const options = await createI18nOptions()
    i18n = createI18n(options)
    app.use(i18n)
}
